package br.edu.oxente.buzz.entity;

import java.util.LinkedList;
import java.util.List;

/**
 *
 * @author Nigini A. Oliveira - ensino@nigini.com.br
 */
public class Buzz {

	private User owner;
	private List<User> followers, followeds;
	private List<Post> posts;

	public Buzz( User owner ) {
		this.owner = owner;
		this.posts = new LinkedList<Post>();
		this.followeds = new LinkedList<User>();
		this.followers = new LinkedList<User>();
	}

	/**
	 * Retorna o usuário dono desta conta Buzz.
	 * @return o usuário dono desta conta Buzz.
	 */
	public User getOwner() {
		return owner;
	}

	/**
	 * Retorna os últimos posts inseridos.
	 * @return uma lista contendo um numero "max" de post, todos os posts
	 * caso "max" maior que o total de posts, e <code>NULL</code> caso
	 * o "max" seja menor que zero.
	 */
	public List<Post> getPosts( int max ) {
		if( max >= 0 ) {
			int total = max;
			if( max > posts.size() ) total = posts.size();
			return posts.subList(0, total);
		}
		return null;
	}

	/**
	 * Adiciona um post.
	 * @param newPost
	 */
	public void insertPost( Post newPost ) {
		this.posts.add(0, newPost);
	}

	/**
	 * Adiciona um novo seguido.
	 * @param userToFollow Usuario a ser seguido. 
	 * @return <code>TRUE</code> caso o usuario esteja sendo seguido agora, e <code>FALSE</code>
	 * caso o userToFollow já esteja sendo seguido.
	 */
	public boolean follow( User userToFollow ) {
		if ( this.followeds.contains( userToFollow ) ) return false;
		else {
			this.followeds.add( userToFollow );
			return true;
		}
	}

	/**
	 * Adiciona um novo seguidor.
	 * @param follower Usuario seguidor.
	 * @return <code>TRUE</code> caso o usuario seja inserido como seguidor, e <code>FALSE</code>
	 * caso o follower já presente na lista.
	 */
	public boolean insertFollower( User follower ) {
		if ( this.followeds.contains( follower ) ) return false;
		else {
			this.followers.add( follower );
			return true;
		}
	}

	/**
	 * Retorna a lista de seguidores desta conta Buzz.
	 * @return a lista de seguidores desta conta Buzz.
	 */
	public List<User> getFollowers() {
		return this.followers;
	}

	/**
	 * Retorna a lista de usuarios seguidos por esta conta Buzz.
	 * @return a lista de usuarios seguidos por esta conta Buzz.
	 */
	public List<User> getFollowed() {
		return this.followeds;
	}
	
}
